Skip to contentMethod: buildObjectWithContextAndGraph(ObjectGraphTraverser, MappingJsonLdContext, Collection)
1: package cz.cvut.kbss.jsonld.serialization;
2:
3: import cz.cvut.kbss.jopa.model.MultilingualString;
4: import cz.cvut.kbss.jsonld.ConfigParam;
5: import cz.cvut.kbss.jsonld.Configuration;
6: import cz.cvut.kbss.jsonld.JsonLd;
7: import cz.cvut.kbss.jsonld.serialization.context.MappingJsonLdContext;
8: import cz.cvut.kbss.jsonld.serialization.model.CollectionNode;
9: import cz.cvut.kbss.jsonld.serialization.model.JsonNode;
10: import cz.cvut.kbss.jsonld.serialization.model.ObjectNode;
11: import cz.cvut.kbss.jsonld.serialization.serializer.LiteralValueSerializers;
12: import cz.cvut.kbss.jsonld.serialization.serializer.ObjectGraphValueSerializers;
13: import cz.cvut.kbss.jsonld.serialization.serializer.ValueSerializer;
14: import cz.cvut.kbss.jsonld.serialization.serializer.ValueSerializers;
15: import cz.cvut.kbss.jsonld.serialization.serializer.context.*;
16: import cz.cvut.kbss.jsonld.serialization.serializer.context.datetime.ContextBuildingTemporalAmountSerializer;
17: import cz.cvut.kbss.jsonld.serialization.serializer.context.datetime.ContextBuildingTemporalSerializer;
18: import cz.cvut.kbss.jsonld.serialization.serializer.datetime.DateSerializer;
19: import cz.cvut.kbss.jsonld.serialization.traversal.ObjectGraphTraverser;
20: import cz.cvut.kbss.jsonld.serialization.traversal.SerializationContextFactory;
21:
22: import java.time.*;
23: import java.util.Collection;
24: import java.util.Date;
25:
26: /**
27: * JSON-LD serializer outputting compacted JSON-LD with context.
28: */
29: public class ContextBuildingJsonLdSerializer extends JsonLdSerializer {
30:
31: ContextBuildingJsonLdSerializer(JsonGenerator jsonGenerator) {
32: super(jsonGenerator);
33: }
34:
35: ContextBuildingJsonLdSerializer(JsonGenerator jsonGenerator, Configuration configuration) {
36: super(jsonGenerator, configuration);
37: }
38:
39: @Override
40: protected ValueSerializers initSerializers() {
41: final ValueSerializer<MultilingualString> mlsSerializer = new ContextBuildingMultilingualStringSerializer();
42: final ValueSerializer<Collection<MultilingualString>> mlsColSerializer =
43: new ContextBuildingPluralMultilingualStringSerializer();
44: final LiteralValueSerializers valueSerializers =
45: new LiteralValueSerializers(new ContextBuildingDefaultValueSerializer(mlsSerializer, mlsColSerializer));
46: valueSerializers.registerIdentifierSerializer(new ContextBuildingIdentifierSerializer());
47: valueSerializers.registerTypesSerializer(new ContextBuildingTypesSerializer());
48: final ContextBuildingTemporalSerializer ts = new ContextBuildingTemporalSerializer();
49: valueSerializers.registerSerializer(LocalDate.class, ts);
50: // Register the same temporal serializer for each of the types it supports (needed for key-based map access)
51: valueSerializers.registerSerializer(LocalDate.class, ts);
52: valueSerializers.registerSerializer(LocalTime.class, ts);
53: valueSerializers.registerSerializer(OffsetTime.class, ts);
54: valueSerializers.registerSerializer(LocalDateTime.class, ts);
55: valueSerializers.registerSerializer(OffsetDateTime.class, ts);
56: valueSerializers.registerSerializer(ZonedDateTime.class, ts);
57: valueSerializers.registerSerializer(Instant.class, ts);
58: valueSerializers.registerSerializer(Date.class, new DateSerializer(ts));
59: final ContextBuildingTemporalAmountSerializer tas = new ContextBuildingTemporalAmountSerializer();
60: valueSerializers.registerSerializer(Duration.class, tas);
61: valueSerializers.registerSerializer(Period.class, tas);
62: return valueSerializers;
63: }
64:
65: @Override
66: protected JsonNode buildJsonTree(Object root) {
67: final MappingJsonLdContext context = new MappingJsonLdContext();
68: final ObjectGraphTraverser traverser =
69: new ObjectGraphTraverser(new SerializationContextFactory(context));
70: traverser.setRequireId(configuration().is(ConfigParam.REQUIRE_ID));
71: if (root instanceof Collection) {
72: return buildObjectWithContextAndGraph(traverser, context, (Collection<?>) root);
73: }
74: final JsonLdTreeBuilder treeBuilder = initTreeBuilder(traverser);
75: traverser.setVisitor(treeBuilder);
76: traverser.traverse(root);
77: treeBuilder.getTreeRoot().prependItem(context.getContextNode());
78: return treeBuilder.getTreeRoot();
79: }
80:
81: private JsonLdTreeBuilder initTreeBuilder(ObjectGraphTraverser traverser) {
82: return new JsonLdTreeBuilder(new ObjectGraphValueSerializers(serializers,
83: new ContextBuildingObjectPropertyValueSerializer(
84: traverser)));
85: }
86:
87: private JsonNode buildObjectWithContextAndGraph(ObjectGraphTraverser traverser, MappingJsonLdContext context,
88: Collection<?> items) {
89: final CollectionNode<?> graph = JsonNodeFactory.createCollectionNodeFromArray(JsonLd.GRAPH);
90: items.stream().map(item -> {
91: final JsonLdTreeBuilder treeBuilder = initTreeBuilder(traverser);
92: traverser.setVisitor(treeBuilder);
93: traverser.traverse(item);
94: return treeBuilder.getTreeRoot();
95: }).forEach(graph::addItem);
96: final ObjectNode result = JsonNodeFactory.createObjectNode();
97: result.addItem(context.getContextNode());
98: result.addItem(graph);
99: return result;
100: }
101: }